package org.aceor.mddal.common.sharding;

/**
 * Created by lxue on 16/3/26.
 */
public interface ShardingFunction {
    /**
     * 分库分表字段
     * @return
     */
    String getShardingColumn();

    /**
     * 分库分表字段范围表示时,增长的步长
     * 如 id between 3 and 10
     * 如果id是数值类型,并指定步长为1 ==> id可取值为3,4,5...,9,10
     *
     * @return 暂时只使用int或long,分别用于简单的整数增长和时间增长
     */
    Number getStep();

    /**
     * 步长增减最大次数
     * 如 id > 3 且step = 1 这时枚举不完了
     * 因此可以设定maxStepCounts = 10 ==> id可取值为3,4,5...,11,12
     * @return
     */
    int getMaxStepCounts();

    /**
     * 步长单位.增数值1还是加1小时
     * @return
     */
    LinearMeasure getLinearMeasure();

    /**
     * 分库分表逻辑
     * @param value 分库分表字段值
     * @return 表示落入第几个库或第几张表
     */
    int executeSharding(Object value);

    /**
     * 暂时支持时间和整数数值
     */
    public enum LinearMeasure {
        SECOND,MINUTE,HOUR,DAY,MOUTH,YEAR,NUMBER
        ;
    }
}
